package org.mcjug.locationmailer.model.template;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.mcjug.locationmailer.model.StatusMessage;

import android.content.Context;

public class TemplateItemContainer {

    private static TemplateItemContainer instance;

    private static List<TemplateItem> templateItems;

    static {
        templateItems = new ArrayList<TemplateItem>();
        templateItems.add(new DayOfWeekTemplateItem());
        templateItems.add(new DayOfMonthTemplateItem());
        templateItems.add(new MonthOfYearTemplateItem());
        templateItems.add(new LocationProviderTemplateItem());
        templateItems.add(new LatitudeTemplateItem());
        templateItems.add(new LongtitudeTemplateItem());
        templateItems.add(new AddressTemplateItem());
        templateItems.add(new GoogleMapsUrlTemplateItem());
        templateItems.add(new ErrorMessageTemplateItem());
        templateItems.add(new QuoteOfDayTemplateItem());
    }

    private TemplateItemContainer() {

    }

    public static TemplateItemContainer getInstance() {
        if (instance == null) {
            instance = new TemplateItemContainer();
        }
        return instance;
    }

    public String replaceWildcardsWithValues(StatusMessage statusMessage, String target, Context context) {
        for (TemplateItem ti : templateItems) {
            String tiName = context.getString(ti.getTemplateItemId());
            if (!target.contains(tiName)) {
                continue;
            }
            boolean useTemplate = false;
            if (statusMessage.getLocation() != null) {
                useTemplate = ((ti.getTemplateFlag() & TemplateItem.FLAG_LOCATION) >= 1);
            } else {
                useTemplate = ((ti.getTemplateFlag() & TemplateItem.FLAG_NO_LOCATION) >= 1);
            }

            if (useTemplate) {
                ti.setStatusMessage(statusMessage);
                target = target.replace(tiName, ti.getTemplateItemValue());
            }
        }
        return target;
    }

    public List<TemplateItem> getTemplateItems() {
        return Collections.unmodifiableList(templateItems);
    }

    public static List<String> getLabels(int flag, Context context) {
        List<String> labels = new ArrayList<String>();

        for (TemplateItem ti : templateItems) {
            if (((ti.getTemplateFlag() & flag) >= 1)) {
                labels.add(context.getString(ti.getTemplateItemId()));
            }
        }

        Collections.sort(labels);

        return labels;
    }

}
